package com.lu.library

import android.app.Application
import android.content.Context
import android.os.StrictMode
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.preferencesDataStore
import com.alibaba.android.arouter.facade.model.RouteMeta
import com.alibaba.android.arouter.launcher.ARouter
import com.blankj.utilcode.util.GsonUtils
import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.ReflectUtils
import com.blankj.utilcode.util.Utils
import com.google.gson.GsonBuilder
import com.lu.library.base.AbsInit
import com.lu.library.kv.DataStoreManager
import com.lu.library.utils.CpuUtils
import com.tencent.mmkv.MMKV
import me.shouheng.utils.UtilsApp
import top.shixinzhang.bitmapmonitor.BitmapMonitor

val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = DataStoreManager.KEY_SP_NAME)
/**
 */
object CommLibInit: AbsInit {
    lateinit var appContext: Context
        private set
    private var isDebug = false
    lateinit var dataStore : DataStore<Preferences>
    fun getApp():Context{
        return appContext
    }
   override fun onInit(context: Application) {
        this.appContext = context.applicationContext
       dataStore = context.dataStore
       Utils.init(context)
       GsonUtils.setGson("lenient", GsonBuilder().serializeNulls().setLenient().create())
       UtilsApp.init(context)
       LogUtils.getConfig().setBorderSwitch(false)
       LogUtils.d("**********************app start***************************")
       initFacebook()
       init70Camera()
       initARouter(context);
       initMMKV()
//       initBitmapMonitor()
    }
    private fun initBitmapMonitor(){

        if (CpuUtils.isX86()){
            LogUtils.w("x86 not support BitmapMonitor")
            return
        }

        val checkInterval: Long = 10
        val threshold = (100 * 1024).toLong()
        val restoreImageThreshold = (100 * 1024).toLong()
        val dir: String = appContext.getExternalFilesDir("bitmap_monitor")!!.absolutePath

        val config: BitmapMonitor.Config = BitmapMonitor.Config.Builder()
            .checkRecycleInterval(checkInterval) //检查图片是否被回收的间隔，单位：秒 （建议不要太频繁，默认 5秒）
            .getStackThreshold(threshold) //获取堆栈的阈值，当一张图片占据的内存超过这个数值后就会去抓栈
            .restoreImageThreshold(restoreImageThreshold) //还原图片的阈值，当一张图占据的内存超过这个数值后，就会还原出一张原始图片
            .restoreImageDirectory(dir) //保存还原后图片的目录
            .showFloatWindow(true) //是否展示悬浮窗，可实时查看内存大小（建议只在 debug 环境打开）
            .clearAllFileWhenRestartApp(true) //重启后清除本地所有文件（目前不支持展示历史数据，所以默认清除本地所有 2023.03.12）
            .clearFileWhenOutOfThreshold(false) //运行时超出阈值就清理，阈值为 diskCacheLimitBytes
            .diskCacheLimitBytes(100 * 1024 * 1024) //本地图片缓存写入上限，单位为 byte，默认大小为 512MB，超出后会立刻删除
            .isDebug(true)
            .context(appContext)
            .build()
        BitmapMonitor.init(config)
        BitmapMonitor.start()
    }
    private fun initMMKV(){
        MMKV.initialize(appContext)
    }
   private fun initARouter(context: Application){
       ARouter.openLog();
       ARouter.openDebug();
       ARouter.printStackTrace();
       ARouter.init(context)

        var warehouseName = "com.alibaba.android.arouter.core.Warehouse"
//       var warehouse = ReflectUtils.reflect(warehouseName).newInstance().field("")
//       warehouse.
       var routes:Map<String, RouteMeta> = ReflectUtils.reflect(warehouseName).field("routes").get()
   }

    /**
     * 初始化捕获日志辅助类
     */
    fun initCrashHandler(dir: String?) {
        //正式版才采用crash
        if (!isDebug) {
//            CrashUtil.getInstance().init(appContext)
//            CrashUtil.getInstance().setCrashDir(dir)
        }
    }

    private fun initFacebook() {
    }

    private fun init70Camera() {
        // android 7.0系统解决拍照的问题
        val builder = StrictMode.VmPolicy.Builder()
        StrictMode.setVmPolicy(builder.build())
        builder.detectFileUriExposure()
    }
}
